<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>番茄倒计时</title>
</head>

<body>
<div class="container">
<!--  倒计时canvas-->
  <canvas id="canvas" width="300" height="300"></canvas>
<!--  倒计时文本-->
  <div class="text"></div>
</div>
<style>
  body {
    /* 使用 flexbox 布局，使页面元素在水平和垂直方向上都居中 */
    display: flex;
    justify-content: center;
    align-items: center;
    /* 设置页面主体高度为视口高度，即占满整个屏幕高度 */
    height: 100vh;
    /* 去除页面默认的内外边距 */
    margin: 0;
    padding: 0;
    /* 设置页面背景颜色为浅灰色 */
    background-color: #f0f0f0;
  }
  .container {
    position: relative;
  }
  #canvas {
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    /*background: #3e90f7;*/
  }
  .text {
    width: 50px;
    height: 50px;
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    /*background: #0be4cb;*/
    text-align: center;
    line-height: 50px;
  }
</style>
<script>
  // 获取canvas
  const canvas = document.getElementById('canvas');
  // 获取倒计时文本
  const text = document.querySelector('.text');
  // 获取canvas的绘图上下文
  const ctx = canvas.getContext('2d');
  // 定义倒计时总时间
  const totalTime  = 180;
  // 定义剩余时间
  let remainingTime = totalTime;
  // 定义中心坐标与半径
  const centerX = canvas.width / 2;
  const centerY = canvas.height / 2;
  console.log(centerX, centerY)
  const radius = 100;
  // 绘制倒计时
  const draw = ()=>{
    // 清除整个 canvas 上之前绘制的内容，以便重新绘制
    ctx.clearRect(0, 0, canvas.width, canvas.height);
    // 计算时间占比
    const ratio = remainingTime / totalTime;
    // 背景圆
    ctx.beginPath();
    ctx.arc(centerX, centerY, radius, 0, 2 * Math.PI);
    ctx.strokeStyle = '#a64dff';
    ctx.lineWidth = 10;
    ctx.stroke();

    // 倒计时圆
    ctx.beginPath();
    // 绘制倒计时圆弧，起始角度为 -π/2（即 270 度，使圆弧从顶部开始绘制），结束角度根据剩余时间的比例计算得出
    ctx.arc(centerX, centerY, radius, -Math.PI / 2, -Math.PI / 2 + 2 * Math.PI * ratio);
    // 设置倒计时圆弧的线条颜色为红色
    ctx.strokeStyle = '#ff0000';
    // 设置倒计时圆弧的线条宽度为 10px
    ctx.lineWidth = 10;
    ctx.lineCap = 'round';
    // 绘制倒计时圆弧
    ctx.stroke();
    // 更新时间
    text.innerHTML = remainingTime;
  }
  const end = setInterval(()=>{
    draw();
    if(remainingTime > 0){
      remainingTime--;
    }else{
      clearInterval(end);
    }
  },1000)
  draw()
</script>
</body>

</html>